home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / jam / jamdisk9 / fpu-mathtrans / benchmark.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  11KB  |  486 lines

  1. #include <exec/exec.h>
  2. #include <functions.h>
  3. #include <math.h>
  4. #include <libraries/dos.h>
  5. #include <libraries/dosextens.h>
  6. #include <stdio.h>
  7.  
  8. /*
  9.     BenchMark.C
  10.     Written by
  11.  
  12.     Heiner Hückstädt
  13.     Gellertstraße 12
  14.     D-5090 Leverkusen 1
  15.  
  16.     Public Domain    
  17.  
  18.  
  19.     Compile with Manx V3.6
  20.  
  21.         cc -s Benchmark.c
  22.         ln Benchmark.o -lm -lc
  23.  
  24.     
  25.  
  26. */ 
  27.  
  28. float sinus,cosinus;
  29. struct Library *MathTransBase;
  30. struct Library *FPU,*OLD;
  31.  
  32.  
  33. float SPAtan();
  34. float SPSin();
  35. float SPCos();
  36. float SPTan();
  37. float SPSincos();
  38. float SPSinh();
  39. float SPCosh();
  40. float SPTanh();
  41. float SPExp();
  42. float SPLog();
  43. float SPPow();
  44. float SPSqrt();
  45. ULONG SPTieee();
  46. float SPFieee();
  47. float SPAsin();
  48. float SPAcos();
  49. float SPLog10();
  50.  
  51. #define DUMMY 2.0
  52. #define MAXLOOPS 25000
  53.  
  54. BPTR fh;
  55. long time1[3];
  56. long time2[3];
  57. char mess[100];
  58. long ieee;
  59.  
  60. #define TIMESTART DateStamp(&time1[0])
  61. #define TIMEEND DateStamp(&time2[0])
  62. #define SHOWTIME Time(&time1[0],&time2[0])
  63. #define WAITKEY     Print("\nAny key to continue (ESC to quit)\n");\
  64.          Read(fh,mess,1L);\
  65.          if(mess[0] == 0x1b) goto quit_and_die
  66.  
  67. long strlen();
  68.  
  69. float fputime,oldtime,fpu_all,old_all;
  70.  
  71.  
  72. void Print(text)
  73. register char *text;
  74. {
  75.  Write(fh,text,strlen(text));
  76. }
  77.  
  78.  
  79. float Time(v1,v2)
  80. long *v1;
  81. long *v2;
  82. {
  83.     float time;
  84.     long sek;
  85.     long dummy;
  86.  
  87.     dummy = v2[1]-v1[1];
  88.  
  89.     if (dummy == 0) sek = v2[2]-v1[2];
  90.     else sek = (dummy*3000)-v1[2]+v2[2];
  91.  
  92.     time = ((float)sek)/50.0;
  93.     sprintf(mess,"%d Loops in %.2f seconds\n",MAXLOOPS,time);
  94.     Write(fh,mess,strlen(mess));
  95.     return(time);    
  96. }
  97. void Performance()
  98. {
  99.   float factor;
  100.  
  101.   factor = oldtime/fputime;
  102.   if(factor < 1.0)
  103.     {
  104.      sprintf(mess,"OH BOY.. This function performs %.2f times slower\n",fputime/oldtime);
  105.      Write(fh,mess,strlen(mess));
  106.     }    
  107.   else
  108.     {
  109.      sprintf(mess,"GOODIE GOODIE.. This function performs %.2f times faster\n",factor);
  110.      Write(fh,mess,strlen(mess));
  111.     }    
  112.   if(fabs(1.0-factor) < 0.05)
  113.     {
  114.      sprintf(mess,"HMMM.. Seems that there is quite no difference\n");
  115.      Write(fh,mess,strlen(mess));
  116.     }
  117. }
  118.  
  119. main()
  120. {
  121.  register int i;
  122.  
  123.  fpu_all = old_all = 0.0;
  124.  
  125.  if((fh = Open("RAW:100/30/500/130/FPU-Mathtrans Benchmark  © HH 1990",MODE_NEWFILE)))
  126.   { 
  127.    FPU = (struct Library *)OpenLibrary("mathtrans.library",0L);
  128.    OLD = (struct Library *)OpenLibrary("old-trans.library",0L);
  129.  
  130. /*    The old-trans.library is a renamed copy of the original
  131.     mathtrans.library used only for comparision.
  132. */
  133.  
  134.    if(FPU && OLD)
  135.     {
  136.  
  137.      Print("Atan (2.0) ..\n");
  138.       MathTransBase = FPU;
  139.      TIMESTART;
  140.      for(i=0;i<MAXLOOPS;i++)  sinus = SPAtan(DUMMY); 
  141.      TIMEEND;
  142.      sprintf(mess,"FPU : Atan = %f\n",sinus);
  143.      Write(fh,mess,strlen(mess));
  144.      fputime = SHOWTIME;
  145.      MathTransBase = OLD;
  146.      TIMESTART;
  147.      for(i=0;i<MAXLOOPS;i++)  sinus = SPAtan(DUMMY); 
  148.      TIMEEND;
  149.      sprintf(mess,"FFP : Atan = %f\n",sinus);
  150.      Write(fh,mess,strlen(mess));
  151.      oldtime = SHOWTIME;
  152.      Performance();
  153.      fpu_all += fputime;
  154.      old_all += oldtime;
  155.      WAITKEY;
  156.  
  157.      Print("Sin (2.0) ..\n");
  158.       MathTransBase = FPU;
  159.      TIMESTART;
  160.      for(i=0;i<MAXLOOPS;i++)  sinus = SPSin(DUMMY); 
  161.      TIMEEND;
  162.      sprintf(mess,"FPU : Sin = %f\n",sinus);
  163.      Write(fh,mess,strlen(mess));
  164.      fputime = SHOWTIME;
  165.      MathTransBase = OLD;
  166.      TIMESTART;
  167.      for(i=0;i<MAXLOOPS;i++)  sinus = SPSin(DUMMY); 
  168.      TIMEEND;
  169.      sprintf(mess,"FFP : Sin = %f\n",sinus);
  170.      Write(fh,mess,strlen(mess));
  171.      oldtime = SHOWTIME;
  172.      Performance();
  173.      fpu_all += fputime;
  174.      old_all += oldtime;
  175.      WAITKEY;
  176.  
  177.      Print("Cos (2.0) ..\n");
  178.       MathTransBase = FPU;
  179.      TIMESTART;
  180.      for(i=0;i<MAXLOOPS;i++)  sinus = SPCos(DUMMY); 
  181.      TIMEEND;
  182.      sprintf(mess,"FPU : Cos = %f\n",sinus);
  183.      Write(fh,mess,strlen(mess));
  184.      fputime = SHOWTIME;
  185.      MathTransBase = OLD;
  186.      TIMESTART;
  187.      for(i=0;i<MAXLOOPS;i++)  sinus = SPCos(DUMMY); 
  188.      TIMEEND;
  189.      sprintf(mess,"FFP : Cos = %f\n",sinus);
  190.      Write(fh,mess,strlen(mess));
  191.      oldtime = SHOWTIME;
  192.      Performance();
  193.      fpu_all += fputime;
  194.      old_all += oldtime;
  195.      WAITKEY;
  196.  
  197.      Print("Sincos (2.0) ..\n");
  198.       MathTransBase = FPU;
  199.      TIMESTART;
  200.      for(i=0;i<MAXLOOPS;i++)  sinus = SPSincos(&cosinus,DUMMY); 
  201.      TIMEEND;
  202.      sprintf(mess,"FPU : Sinus = %f Cosinus = %f\n",sinus,cosinus);
  203.      Write(fh,mess,strlen(mess));
  204.      fputime = SHOWTIME;
  205.      MathTransBase = OLD;
  206.      TIMESTART;
  207.      for(i=0;i<MAXLOOPS;i++)  sinus = SPSincos(&cosinus,DUMMY); 
  208.      TIMEEND;
  209.      sprintf(mess,"FFP : Sinus = %f Cosinus = %f\n",sinus,cosinus);
  210.      Write(fh,mess,strlen(mess));
  211.      oldtime = SHOWTIME;
  212.      Performance();
  213.      fpu_all += fputime;
  214.      old_all += oldtime;
  215.      WAITKEY;
  216.  
  217.      Print("Sinh (2.0) ..\n");
  218.       MathTransBase = FPU;
  219.      TIMESTART;
  220.      for(i=0;i<MAXLOOPS;i++)  sinus = SPSinh(DUMMY); 
  221.      TIMEEND;
  222.      sprintf(mess,"FPU : Sinh = %f\n",sinus);
  223.      Write(fh,mess,strlen(mess));
  224.      fputime = SHOWTIME;
  225.      MathTransBase = OLD;
  226.      TIMESTART;
  227.      for(i=0;i<MAXLOOPS;i++)  sinus = SPSinh(DUMMY); 
  228.      TIMEEND;
  229.      sprintf(mess,"FFP : Sinh = %f\n",sinus);
  230.      Write(fh,mess,strlen(mess));
  231.      oldtime = SHOWTIME;
  232.      Performance();
  233.      fpu_all += fputime;
  234.      old_all += oldtime;
  235.      WAITKEY;
  236.  
  237.      Print("Cosh (2.0) ..\n");
  238.       MathTransBase = FPU;
  239.      TIMESTART;
  240.      for(i=0;i<MAXLOOPS;i++)  sinus = SPCosh(DUMMY); 
  241.      TIMEEND;
  242.      sprintf(mess,"FPU : Cosh = %f\n",sinus);
  243.      Write(fh,mess,strlen(mess));
  244.      fputime = SHOWTIME;
  245.      MathTransBase = OLD;
  246.      TIMESTART;
  247.      for(i=0;i<MAXLOOPS;i++)  sinus = SPCosh(DUMMY); 
  248.      TIMEEND;
  249.      sprintf(mess,"FFP : Cosh = %f\n",sinus);
  250.      Write(fh,mess,strlen(mess));
  251.      oldtime = SHOWTIME;
  252.      Performance();
  253.      fpu_all += fputime;
  254.      old_all += oldtime;
  255.      WAITKEY;
  256.  
  257.      Print("Tanh (2.0) ..\n");
  258.       MathTransBase = FPU;
  259.      TIMESTART;
  260.      for(i=0;i<MAXLOOPS;i++)  sinus = SPTanh(DUMMY); 
  261.      TIMEEND;
  262.      sprintf(mess,"FPU : Tanh = %f\n",sinus);
  263.      Write(fh,mess,strlen(mess));
  264.      fputime = SHOWTIME;
  265.      MathTransBase = OLD;
  266.      TIMESTART;
  267.      for(i=0;i<MAXLOOPS;i++)  sinus = SPTanh(DUMMY); 
  268.      TIMEEND;
  269.      sprintf(mess,"FFP : Tanh = %f\n",sinus);
  270.      Write(fh,mess,strlen(mess));
  271.      oldtime = SHOWTIME;
  272.      Performance();
  273.      fpu_all += fputime;
  274.      old_all += oldtime;
  275.      WAITKEY;
  276.  
  277.      Print("Exp (2.0) ..\n");
  278.       MathTransBase = FPU;
  279.      TIMESTART;
  280.      for(i=0;i<MAXLOOPS;i++)  sinus = SPExp(DUMMY); 
  281.      TIMEEND;
  282.      sprintf(mess,"FPU : Exp = %f\n",sinus);
  283.      Write(fh,mess,strlen(mess));
  284.      fputime = SHOWTIME;
  285.      MathTransBase = OLD;
  286.      TIMESTART;
  287.      for(i=0;i<MAXLOOPS;i++)  sinus = SPExp(DUMMY); 
  288.      TIMEEND;
  289.      sprintf(mess,"FFP : Exp = %f\n",sinus);
  290.      Write(fh,mess,strlen(mess));
  291.      oldtime = SHOWTIME;
  292.      Performance();
  293.      fpu_all += fputime;
  294.      old_all += oldtime;
  295.      WAITKEY;
  296.  
  297.      Print("Log (2.0) ..\n");
  298.       MathTransBase = FPU;
  299.      TIMESTART;
  300.      for(i=0;i<MAXLOOPS;i++)  sinus = SPLog(DUMMY); 
  301.      TIMEEND;
  302.      sprintf(mess,"FPU : Log = %f\n",sinus);
  303.      Write(fh,mess,strlen(mess));
  304.      fputime = SHOWTIME;
  305.      MathTransBase = OLD;
  306.      TIMESTART;
  307.      for(i=0;i<MAXLOOPS;i++)  sinus = SPLog(DUMMY); 
  308.      TIMEEND;
  309.      sprintf(mess,"FFP : Log = %f\n",sinus);
  310.      Write(fh,mess,strlen(mess));
  311.      oldtime = SHOWTIME;
  312.      Performance();
  313.      fpu_all += fputime;
  314.      old_all += oldtime;
  315.      WAITKEY;
  316.  
  317. /*    Mysterious    SPPow does not compute ?? */
  318.  
  319.      Print("Pow (4.0,2.0) ..\n");
  320.       MathTransBase = FPU;
  321.      TIMESTART;
  322.      for(i=0;i<MAXLOOPS;i++)  sinus = pow(4.0,DUMMY); 
  323.      TIMEEND;
  324.      sprintf(mess,"FPU : Pow = %f\n",sinus);
  325.      Write(fh,mess,strlen(mess));
  326.      fputime = SHOWTIME;
  327.      MathTransBase = OLD;
  328.      TIMESTART;
  329.      for(i=0;i<MAXLOOPS;i++)  sinus = pow(4.0,DUMMY); 
  330.      TIMEEND;
  331.      sprintf(mess,"FFP : Pow = %f\n",sinus);
  332.      Write(fh,mess,strlen(mess));
  333.      oldtime = SHOWTIME;
  334.      Performance();
  335.      fpu_all += fputime;
  336.      old_all += oldtime;
  337.      WAITKEY;
  338.  
  339.      Print("Sqrt (2.0) ..\n");
  340.       MathTransBase = FPU;
  341.      TIMESTART;
  342.      for(i=0;i<MAXLOOPS;i++)  sinus = SPSqrt(DUMMY); 
  343.      TIMEEND;
  344.      sprintf(mess,"FPU : Sqrt = %f\n",sinus);
  345.      Write(fh,mess,strlen(mess));
  346.      fputime = SHOWTIME;
  347.      MathTransBase = OLD;
  348.      TIMESTART;
  349.      for(i=0;i<MAXLOOPS;i++)  sinus = SPSqrt(DUMMY); 
  350.      TIMEEND;
  351.      sprintf(mess,"FFP : Sqrt = %f\n",sinus);
  352.      Write(fh,mess,strlen(mess));
  353.      oldtime = SHOWTIME;
  354.      Performance();
  355.      fpu_all += fputime;
  356.      old_all += oldtime;
  357.      WAITKEY;
  358.  
  359.      Print("Tieee (2.0) ..\n");
  360.       MathTransBase = FPU;
  361.      TIMESTART;
  362.      for(i=0;i<MAXLOOPS;i++)  ieee = SPTieee(DUMMY); 
  363.      TIMEEND;
  364.      sprintf(mess,"FPU : Tieee = $%lx\n",ieee);
  365.      Write(fh,mess,strlen(mess));
  366.      fputime = SHOWTIME;
  367.      MathTransBase = OLD;
  368.      TIMESTART;
  369.      for(i=0;i<MAXLOOPS;i++)  ieee = SPTieee(DUMMY); 
  370.      TIMEEND;
  371.      sprintf(mess,"FFP : Tieee = $%lx\n",ieee);
  372.      Write(fh,mess,strlen(mess));
  373.      oldtime = SHOWTIME;
  374.      Performance();
  375.      fpu_all += fputime;
  376.      old_all += oldtime;
  377.      WAITKEY;
  378.  
  379.      Print("Fieee (2.0) ..\n");
  380.       MathTransBase = FPU;
  381.      TIMESTART;
  382.      for(i=0;i<MAXLOOPS;i++)  sinus = SPFieee(ieee); 
  383.      TIMEEND;
  384.      sprintf(mess,"FPU : Fieee = %f FFP $%lx\n",sinus,sinus);
  385.      Write(fh,mess,strlen(mess));
  386.      fputime = SHOWTIME;
  387.      MathTransBase = OLD;
  388.      TIMESTART;
  389.      for(i=0;i<MAXLOOPS;i++)  sinus = SPFieee(ieee); 
  390.      TIMEEND;
  391.      sprintf(mess,"FFP : Fieee = %f FFP $%lx\n",sinus,sinus);
  392.      Write(fh,mess,strlen(mess));
  393.      oldtime = SHOWTIME;
  394.      Performance();
  395.      fpu_all += fputime;
  396.      old_all += oldtime;
  397.      WAITKEY;
  398.  
  399.      Print("Asin (0.5) ..\n");
  400.       MathTransBase = FPU;
  401.      TIMESTART;
  402.      for(i=0;i<MAXLOOPS;i++)  sinus = SPAsin(0.5); 
  403.      TIMEEND;
  404.      sprintf(mess,"FPU : Asin = %f\n",sinus);
  405.      Write(fh,mess,strlen(mess));
  406.      fputime = SHOWTIME;
  407.      MathTransBase = OLD;
  408.      TIMESTART;
  409.      for(i=0;i<MAXLOOPS;i++)  sinus = SPAsin(0.5); 
  410.      TIMEEND;
  411.      sprintf(mess,"FFP : Asin = %f\n",sinus);
  412.      Write(fh,mess,strlen(mess));
  413.      oldtime = SHOWTIME;
  414.      Performance();
  415.      fpu_all += fputime;
  416.      old_all += oldtime;
  417.      WAITKEY;
  418.  
  419.      Print("Acos (0.5) ..\n");
  420.       MathTransBase = FPU;
  421.      TIMESTART;
  422.      for(i=0;i<MAXLOOPS;i++)  sinus = SPAcos(0.5); 
  423.      TIMEEND;
  424.      sprintf(mess,"FPU : Acos = %f\n",sinus);
  425.      Write(fh,mess,strlen(mess));
  426.      fputime = SHOWTIME;
  427.      MathTransBase = OLD;
  428.      TIMESTART;
  429.      for(i=0;i<MAXLOOPS;i++)  sinus = SPAcos(0.5); 
  430.      TIMEEND;
  431.      sprintf(mess,"FFP : Acos = %f\n",sinus);
  432.      Write(fh,mess,strlen(mess));
  433.      oldtime = SHOWTIME;
  434.      Performance();
  435.      fpu_all += fputime;
  436.      old_all += oldtime;
  437.      WAITKEY;
  438.  
  439.      Print("Log10 (2.0) ..\n");
  440.       MathTransBase = FPU;
  441.      TIMESTART;
  442.      for(i=0;i<MAXLOOPS;i++)  sinus = SPLog10(DUMMY); 
  443.      TIMEEND;
  444.      sprintf(mess,"FPU : Log10 = %f\n",sinus);
  445.      Write(fh,mess,strlen(mess));
  446.      fputime = SHOWTIME;
  447.      MathTransBase = OLD;
  448.      TIMESTART;
  449.      for(i=0;i<MAXLOOPS;i++)  sinus = SPLog10(DUMMY); 
  450.      TIMEEND;
  451.      sprintf(mess,"FFP : Log10 = %f\n",sinus);
  452.      Write(fh,mess,strlen(mess));
  453.      oldtime = SHOWTIME;
  454.      Performance();
  455.      fpu_all += fputime;
  456.      old_all += oldtime;
  457.      WAITKEY;
  458.  
  459.      Print("\nBenchmark terminated\n");
  460.      sprintf(mess,"Elapsed benchmark time FPU :%.2f seconds\n",fpu_all);
  461.      Write(fh,mess,strlen(mess));
  462.      sprintf(mess,"Elapsed benchmark time FFP :%.2f seconds\n",old_all);
  463.      Write(fh,mess,strlen(mess));
  464.      sprintf(mess,"FPU => FFP      %.2f => 1.0\n",old_all/fpu_all,1.0);
  465.      Write(fh,mess,strlen(mess));
  466.       
  467.      Print("\nPress Return to quit..\n");
  468.      Read(fh,mess,1L);
  469.  
  470. quit_and_die:
  471.       MathTransBase = FPU;
  472.      CloseLibrary(MathTransBase);
  473.      CloseLibrary(OLD);
  474.     }
  475.      else
  476.     {
  477.      Print("Error\n");
  478.      sprintf(mess,"Mathtrans Base $%lx\nOld-Trans Base $%lx\n",FPU,OLD);
  479.      Write(fh,mess,strlen(mess));
  480.      Read(fh,mess,1L);
  481.        }
  482.      Close(fh);    
  483.    }
  484. }
  485.  
  486.